// 代码题 1
// 基于以下代码完成下面的四个练习
const fp = require('lodash/fp')
const _  = require('lodash')
// const { Maybe, Container } = require('./support')
//数据
// horsepower 马力， dollar_value 价格， in_stock 库存
// const cars = [
//     {name: "Ferrari FF", horsepower: 660, dollar_value: 700000, in_stock: true},
//     {name: "Spyker C12 Zagato", horsepower: 650, dollar_value: 648000, in_stock: false},
//     {name: "Jaguar XKR-S", horsepower: 550, dollar_value: 132000, in_stock: false},
//     {name: "Audi R8", horsepower: 525, dollar_value: 114200, in_stock: false},
//     {name: "Aston Martin One-77", horsepower: 750, dollar_value: 1850000, in_stock: true},
//     {name: "Pagani Huyra", horsepower: 700, dollar_value: 1300000, in_stock: false}
// ] 

// 练习 1
// 使用函数组合fp.flowRight()重新实现下面这个函数
// let isLastInStock = function(cars) {
//     // 获取最后一条数据
//     let last_car = fp.last(cars)
//     // 获取最后一条数据的 in_stock 属性值
//     return fp.prop('in_stock', last_car)
// }

// 答案
const isLastInStock = fp.flowRight(fp.join('') ,fp.at('in_stock'), fp.last)
console.log(isLastInStock(cars))

// -----------------------------------------------------------------------------------
 
// // 练习2：
// // 使用fp.flowRight()、fp.prop()和fp.first()获取第一个car的name
// 答案
const isLastInStock = fp.flowRight(fp.prop('name'), fp.first)
console.log(isLastInStock(cars))     //Ferrari FF

// -----------------------------------------------------------------------------------

// // 练习3：
// //使用帮助函数 _average 重构 averageDollarValue, 使用函数组合的方式实现
// let _average = function(xs) {
//     return fp.reduce(fp.add, 0, xs) / xs.length
// }
// // <-无须改动
// let averageDollarValue = function (cars) {
//     let dollar_values = fp.map(function(car) {
//         return car.dollar_value
//     }, cars)
//     return _average(dollar_values)
// }

// 答案
let xs = _.map(cars, 'dollar_value')
console.log(_average(xs))        //790700

// -----------------------------------------------------------------------------------

// // 练习4：
// // 使用flowRight写一个sanitizeNames() 函数，返回一个下划线连接的小写字符串，把数组中的name转换为这种形式：例如sanitizeNames(["Hello World"]) => ["hello_world"]
// let _underscore = fp.replace(/\W+/g, '_')    //  <-- 无须改动，并在 sanitizeNames 中使用它

// 答案
let _underscore = fp.replace(/\W+/g, '_')
let sanitizeNames = fp.flowRight(fp.split(' '), _underscore, fp.toLower)
console.log(sanitizeNames(['Hello World']))



// // ----------------------------------------------------------------------------------------------------------------------------

// // 代码题2

// // 基于下面提供的代码，完成后续的四个练习
// // support.js
// class Container {
//     static of (value) {
//         return new Container(value)
//     }

//     constructor (value) {
//         this._value = value
//     }

//     map (fn) {
//         return Container.of(fn(this._value))
//     }
// }

// class Maybe {
//     static of (x) {
//         return new Maybe(x)
//     }
//     isNothing () {
//         return this._value === null || this._value === undefined
//     }
//     constructor (x) {
//         this._value = x
//     }
//     map (fn) {
//         return this.isNothing() ? this : Maybe.of(fn(this._value))
//     }
// }

// module.exports = {
//     Maybe,
//     Container
// }

// // 练习1：
// // 使用 fp.add(x, y) 和 fp.map(f, x) 创建一个能让 functor 里的值增加的函数 ex1
// const fp = require('lodash/fp')
// const { Maybe, Container } = require('./support')
// let maybe = Maybe.of([5, 6, 1])
// let ex1 = maybe._value.map(x => fp.add(x, 1))
// console.log(ex1)

// 答案
maybe._value.map(x => fp.add(x, 1))
console.log(ex1)

// -----------------------------------------------------------------------------------

// // 练习2：
// // 实现一个函数 ex2， 能够使用 fp.first 获取列表的第一个元素
// const fp = require('lodash/fp')
// const { Maybe, Container } = require('./support')
// let xs = Container.of(['do', 'ray', 'me', 'fa', 'so', 'la', 'ti', 'do'])
// let ex2 = fp.first(xs._value)
// console.log(fp.first(xs._value))

// 答案
let ex2 = fp.first(xs._value)
console.log(fp.first(xs._value))

// -----------------------------------------------------------------------------------

// // 练习3：
// // 实现一个函数 ex3， 使用 safeProp 和 fp.first 找到 user 的名字的首字母
// const fp = require('lodash/fp')
// const { Maybe, Container } = require('./support')
// let safeProp = fp.curry(function (x, o) {
//     return Maybe.of(o[x])
// })
// let user = { id: 2, name: 'Albert' }
// let ex3 = fp.first(safeProp("name", user)._value)
// console.log(ex3)

// 答案
let ex3 = fp.first(safeProp("name", user)._value)
console.log(ex3)

// -----------------------------------------------------------------------------------

// // 练习4：
// // 使用 Maybe 和 ex4， 不要有 if 语句
// const fp = require('lodash/fp')
// const { Maybe, Container } = require('./support')
// let ex4 = function (n) {
//     if (n) {
//         return parseInt(n)
//     }
// }

// 答案
let ex4 = n => parseInt(Maybe.of(n))




